#ifndef CONFIG_H
#define CONFIG_H

#include <QObject>
#include <QSettings>
#include <QString>
#include <QVariant>
#include <QMutex>

/**
 * @brief 配置管理类
 *
 * 功能：
 * - 读取和保存 settings.ini 配置文件
 * - 支持多种数据类型（字符串、整数、浮点数、布尔值等）
 * - 线程安全
 * - 单例模式
 * - 支持配置热更新
 */
class Config : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 获取配置单例
     */
    static Config *instance();

    /**
     * @brief 初始化配置系统
     * @param configFilePath 配置文件路径
     * @return 是否初始化成功
     */
    bool initialize(const QString &configFilePath);

    /**
     * @brief 获取配置值（内部使用）
     * @param key 配置键（支持分组，如 "Serial/Port1"）
     * @param defaultValue 默认值
     * @return 配置值
     */
    QVariant getValue(const QString &key, const QVariant &defaultValue = QVariant()) const;

    /**
     * @brief 设置配置值（内部使用）
     * @param key 配置键
     * @param value 配置值
     */
    void setValue(const QString &key, const QVariant &value);

    /**
     * @brief 保存配置到文件
     */
    void save();

    // ========== 串口配置 ==========
    Q_INVOKABLE QString getSerialPort1() const;
    Q_INVOKABLE QString getSerialPort2() const;
    Q_INVOKABLE QString getSerialPort3() const;
    Q_INVOKABLE int getBaudRate() const;

    // 串口配置设置方法（QML友好）
    Q_INVOKABLE void setSerialPort1(const QString &port);
    Q_INVOKABLE void setSerialPort2(const QString &port);
    Q_INVOKABLE void setSerialPort3(const QString &port);
    Q_INVOKABLE void setBaudRate(int baudRate);

    // ========== Modbus 配置 ==========
    int getModbusTimeout() const;
    int getPollInterval() const;

    // ========== 数据库配置 ==========
    QString getDatabasePath() const;

    // ========== 巴法云配置 ==========
    QString getBemfaHost() const;
    int getBemfaPort() const;
    QString getBemfaUid() const;

    // 主题配置（按配电室分配）
    QString getBemfaTopic1() const; // 配电室A主题 (powercloud001)
    QString getBemfaTopic2() const; // 配电室B主题 (powercloud002)
    QString getBemfaTopic3() const; // 配电室C主题 (powercloud003)

    // 推送间隔配置
    int getBemfaHeartbeatInterval() const;      // 心跳间隔（秒），默认60秒
    int getBemfaDataPushInterval() const;       // 汇总数据推送间隔（秒），默认60秒
    int getBemfaFullDataUploadInterval() const; // 全量数据上传间隔（秒），默认300秒
    bool isBemfaEnabled() const;                // 是否启用巴法云推送

    // ========== 日志配置 ==========
    QString getLogLevel() const;
    bool isLogConsoleEnabled() const;

signals:
    /**
     * @brief 配置更改信号
     */
    void configChanged(const QString &key, const QVariant &value);

private:
    explicit Config(QObject *parent = nullptr);
    ~Config();

    Config(const Config &) = delete;            // 禁止拷贝构造
    Config &operator=(const Config &) = delete; // 禁止赋值操作

private:
    static Config *m_instance; // 配置单例
    static QMutex m_mutex;     // 互斥锁

    QSettings *m_settings;    // 配置设置
    QString m_configFilePath; // 配置文件路径
};

#endif // CONFIG_H
